package Persistencia;

import Datatypes.PDate;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class BDMComentario {
    
    private static BDMComentario instance = null;
    private BDMConexion ct = null; 
    private PreparedStatement ps = null;
    private Statement st = null;

    //CONSTRUCTOR
    
    private BDMComentario(){}
    
    //GETERS
    
    public static synchronized BDMComentario getInstance(){
        
        if(instance == null){
            
            instance = new BDMComentario();
        
        }
        
        return instance;
    
    }
    
    //SETERS
    
    public void setConexion(BDMConexion BDMC){
    
        this.ct = BDMC;
    
    }

    //FUNCIONES PROPIAS

    //AREA DE TRABAJO DE JONATHAN////////////////////////////////////////////////////////////////////////////////////////////////
 
       
    public List<Comentario> getRespuestas(Comentario c) throws Exception{
           
        ResultSet rs;
        
        List<Comentario> lr = new ArrayList();
        
        try{

            String consulta = "SELECT c.numero, c.texto, c.fecha ";
            consulta = consulta.concat(" FROM comentarios c, respuestas_de_comentarios r ");
            consulta = consulta.concat(" WHERE c.numero = r.numero_comentario_hijo ");
            consulta = consulta.concat(" AND r.numero_comentario_padre = " + c.getNumPadre());
            consulta = consulta.concat(" AND c.respuesta = 1 ");       
            st = ct.getConexion().createStatement();
            rs = st.executeQuery(consulta);
            
            while(rs.next()){

                Integer numero = rs.getInt(1);
                String texto = rs.getString(2);
                PDate fecha = new PDate(rs.getString(3));

                Comentario r = new Comentario(texto, fecha, c.getNickCliente(), c.getNomJuego());
                r.setNumero(numero);
                r.setRespuesta(c.getNumero());
                lr.add(r);

            }
            

        }

        catch(SQLException e){
        
            throw new Exception("Error interno!.<br><br>Codigo de Error: BDMCGR<br>Mensaje: " + e.getMessage());
               
        }
        
        return lr;
        
    }
    
    
    public Integer getIDComentario(Comentario c) throws Exception{
    
        ResultSet rs;
        
        Integer id = null;
        
        try{
        
            ps = ct.getConexion().prepareStatement("SELECT numero FROM comentarios WHERE fecha = ? AND texto = ?");
            ps.setString(1, c.getFecha().getSQLDate());
            ps.setString(2, c.getTexto());
            rs = ps.executeQuery();
            
            if(rs.next()){
            
                id = rs.getInt("numero");
                
            }
            
        }
        
        catch(SQLException e){
        
            throw new Exception("Error interno!.<br><br>Codigo de Error: BDMCGIDC<br>Mensaje: " + e.getMessage());
               
        }
        
        return id;
    
    }
    
    public void ingresarComentario(Comentario c) throws Exception{
            
        try{
        
            ps = ct.getConexion().prepareStatement("INSERT INTO comentarios (numero, texto, fecha, respuesta) VALUES (?, ?, ?, ?)");
            ps.setString(1, null);
            ps.setString(2, c.getTexto());
            ps.setString(3, c.getFecha().getSQLDate());
            ps.setBoolean(4, c.esRespuesta());
            ps.executeUpdate();
                                 
            Integer id = getIDComentario(c);
            Integer codigo = getCodigoJuego(c.getNomJuego());
                        
            ps = ct.getConexion().prepareStatement("INSERT INTO comentarios_de_clientes (numero_comentario, nick_cliente) VALUES (?, ?)");
            ps.setInt(1, id);
            ps.setString(2, c.getNickCliente());
            ps.executeUpdate();
            
            ps = ct.getConexion().prepareStatement("INSERT INTO comentarios_de_juegos (numero_comentario, codigo_juego) VALUES (?, ?)");
            ps.setInt(1, id);
            ps.setInt(2, codigo);
            ps.executeUpdate();
            
            if(c.esRespuesta() == true){
            
                ps = ct.getConexion().prepareStatement("INSERT INTO respuestas_de_comentarios (numero_comentario_padre, numero_comentario_hijo) VALUES (?, ?)");
                ps.setInt(1, c.getNumPadre());
                ps.setInt(2, id);
                ps.executeUpdate();
            
            }
            
        }
        
        catch(SQLException e){
        
            
            throw new Exception("Error al ingresar el comentario!.<br><br>Codigo de Error: BDMCIC<br>Mensaje: " + e.getMessage());
               
        }
        
    }
    
    public Integer getCodigoJuego(String nomjuego) throws Exception{
         
        ResultSet rs;
        
        Integer cod = null;
        
        try{
        
            ps = ct.getConexion().prepareStatement("SELECT codigo FROM juegos WHERE nombre = ?");
            ps.setString(1, nomjuego);
            rs = ps.executeQuery();
            
            if(rs.next()){
            
                cod = rs.getInt(1);
            
            }
            
            else{
            
                throw new Exception("El nombre del juego no existe!");
            
            }
            
        }
        
        catch(SQLException e){
        
            throw new Exception("Error interno!.<br><br>Codigo de Error: BDMCGCJ<br>Mensaje: " + e.getMessage());
               
        }
        
        return cod;
        
    }
    
    public String getNomJuego(Integer codJuego) throws Exception{
         
        ResultSet rs;
        
        String nombre = null;
        
        try{
        
            ps = ct.getConexion().prepareStatement("SELECT nombre FROM juegos WHERE codigo = ?");
            ps.setInt(1, codJuego);
            rs = ps.executeQuery();
            
            if(rs.next()){
            
                nombre = rs.getString(1);
            
            }
            
            else{
            
                throw new Exception("El codigo del juego no existe!");
            
            }
            
        }
        
        catch(SQLException e){
        
            throw new Exception("Error interno!.<br><br>Codigo de Error: BDMCGNJ<br>Mensaje: " + e.getMessage());
               
        }
        
        return nombre;
        
    }
    
    public Boolean existePuntaje(Integer codJuego, String nickCliente) throws Exception {
    
        ResultSet rs;
        
        Boolean existe = false;
        
        String consulta = "SELECT 1 FROM puntajes WHERE codJuego = ? AND nickCliente = ?";
        ps = ct.getConexion().prepareStatement(consulta);
        ps.setInt(1, codJuego);
        ps.setString(2, nickCliente);
        rs = ps.executeQuery();
        
        if(rs.next()){
        
            existe = true;
            
        }
        
        return existe;
    
    }
    
    public List<Puntaje> getPuntajesCliente(String nickCliente) throws Exception {
    
        ResultSet rs;
        
        List<Puntaje> p = new ArrayList();
        
        String consulta = " SELECT * FROM puntajes WHERE nickCliente = ? ";
        ps = ct.getConexion().prepareStatement(consulta);
        ps.setString(1, nickCliente);
        rs = ps.executeQuery();
        
        while(rs.next()){

            p.add(new Puntaje(rs.getInt(1), getNomJuego(rs.getInt(2)), rs.getString(3)));

        }
            
        return p;
        
    }
    
    public List<Puntaje> getPuntajesJuego(String nomJuego) throws Exception {
    
        ResultSet rs;
        
        Integer codigo = getCodigoJuego(nomJuego);
        
        List<Puntaje> p = new ArrayList();
        
        String consulta = "SELECT * FROM puntajes WHERE codJuego = ?";
        ps = ct.getConexion().prepareStatement(consulta);
        ps.setInt(1, codigo);
        rs = ps.executeQuery();
        
        while(rs.next()){

            p.add(new Puntaje(rs.getInt(1), nomJuego, rs.getString(3)));

        }
            
        return p;
        
    }
    
    public void ingresarPuntaje(Puntaje p) throws Exception {
    
        Integer codigo = getCodigoJuego(p.getNomJuego());
        
        if(!existePuntaje(codigo, p.getNickCliente())){
            
            String consulta = "INSERT INTO puntajes (puntaje, codJuego, nickCliente) VALUES (?, ?, ?)";
            ps = ct.getConexion().prepareStatement(consulta);
            ps.setInt(1, p.getPuntaje());
            ps.setInt(2, codigo);
            ps.setString(3, p.getNickCliente());
            ps.executeUpdate();
            
        }
        
        else{
        
            String consulta = "UPDATE puntajes SET puntaje = ? WHERE codJuego = ? AND nickCliente = ?";
            ps = ct.getConexion().prepareStatement(consulta);
            ps.setInt(1, p.getPuntaje());
            ps.setInt(2, codigo);
            ps.setString(3, p.getNickCliente());
            ps.executeUpdate();
        
        }
    
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
}
